How To Build Bourne-Again Shell 4.2 for ARM


Intro


In this How To we are going to build Bash 4.2 with our GCC 4.8.2 cross-compiler. Be sure to start this build in a new terminal/tab to avoid any pollution from previous builds.

Tar Balls


Here is a list of source packages that we'll need for the build. You can either download them now or wait 'til later in the How To.
  • bash-4.2.tar.gz
  • bash-4.2-fixes-12.patch

Create a Workspace


I recommend creating a workspace under your /home/<your user>/ directory that is dedicated to this build. So let's fire up your terminal and run the following:
$ export BASH_SRC=~/workbench/bash/src
$ export BASH_BUILD=~/workbench/bash/build
$ mkdir -pv ~/workbench/bash
$ mkdir $BASH_SRC && mkdir $BASH_BUILD
$ cd $BASH_SRC

Gather the Sources


Now that we have a workspace created and we are currently in the src directory we can begin bringing down the sources and extracting them.

bash

$ wget http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz
$ tar -pxzf bash-4.2.tar.gz

patch

$ wget http://www.linuxfromscratch.org/patches/downloads/bash/bash-4.2-fixes-12.patch

Build Environment


To make things a little smoother let's setup some environment variables:
$ export INSTALLDIR=~/workbench/gcc-4.8.2/arm
$ export PATH=$INSTALLDIR/bin:$PATH
$ export TARGETMACH=arm-none-linux-gnueabi
$ export BUILDMACH=i686-pc-linux-gnu
$ export CROSS=arm-none-linux-gnueabi
$ export CC=${CROSS}-gcc
$ export LD=${CROSS}-ld
$ export AS=${CROSS}-as
NOTE: Depending on whether you are using a cross-compiler built from my other wikis you might need to change INSTALLDIR to point to your cross-compiler.

Build


$ cd bash-4.2/
$ patch -Np1 -i ../bash-4.2-fixes-12.patch
$ cd ../../build/
$ ../src/bash-4.2/./configure --prefix=/usr --without-bash-malloc --host=$TARGETMACH --build=$BUILDMACH
$ make
$ make DESTDIR=/home/<your user>/workbench/bash/final install
 
Done!

Output


cd into the final directory and output its contents:
$ cd ../final/usr/
$ ls
You should have the following directories:
  • bin
  • share
Make sure the binaries are for ARM:
$ cd bin/
$ file bash
bash: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
If you see something similar to above you're good to go ;-)

Lastly, move the contents of these directories, or the directories themselves if they do not already exist, to your custom Linux file system or dev board. For bash, the binaries should go to /bin. When in doubt, Linux From Scratch is a good reference or see where your distro put the binary.